﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using UniCT.LinkShareWpf.Interface;
using System.Xml.Serialization;
using System.Collections.ObjectModel;

namespace UniCT.LinkShareWpf.Model
{

    public class MyNode
    {
        #region Static
        private static MyNode _instance = null;

        public static MyNode Instance
        {
            get
            {
                if (_instance == null)
                    _instance = new MyNode();
                return _instance;
            }
        }
        #endregion

        private ObservableCollection<Node> nodes;
        
        // Applicando l'attributo XmlArray, si può cambiare il nome dell'elemento Xml: Nodes -> MyNodes
        // Recupera o imposta un oggetto che specifica come XmlSerializer serializza un campo pubblico o una proprietà in lettura/scrittura 
        // Invece XmlArrayItem, agisce allo stesso modo ma per i relativi Item

        [XmlArray("MyNodes")]
        [XmlArrayItem("Node")]
        public ObservableCollection<Node> Nodes
        {
            get { return nodes; }
        }
        
        public MyNode()
        {
            Read();
        }

        public Boolean Contains(Node node)
        {
            foreach (Node nod in nodes)
                 if (nod.Uri.Equals(node.Uri))
                      return true;
            return false;
        }

        public void Save()
        {
            XmlSerializer xs = null;
            try
            {
                // Serializza oggetti in e da documenti XML
                // Inizializza una nuova istanza in grado di serializzare gli oggetti del tipo specificato
                xs = new XmlSerializer(typeof(ObservableCollection<Node>));
               
                // Inizializza una nuova istanza della classe StreamWriter per il file specificato nel percorso specificato, 
                // utilizzando le dimensioni di buffer e la codifica predefinite. 
                // Se il file esiste, è possibile sovrascriverlo o aggiungervi informazioni ( il booleano permette di fare l'append o sovrascrivere )
                // Se il file non esiste, il costruttore crea un nuovo file.

                using (StreamWriter sw = new StreamWriter("MyNode.xml", false))
                    xs.Serialize(sw, nodes);
            }
            catch { Console.WriteLine("SAVE 2"); }
        }

        public void Read()
        {
            XmlSerializer xs = null;
            try
            {
                xs = new XmlSerializer(typeof(ObservableCollection<Node>));
                using (StreamReader sr = new StreamReader("MyNode.xml"))
                    nodes = xs.Deserialize(sr) as ObservableCollection<Node>;
            }
            catch(FileNotFoundException)
            {
                nodes=new ObservableCollection<Node>();
                Console.WriteLine("Il file contenente i nodi vicini non è stato trovato.");
                Save();
            }
            catch(Exception e)
            {
                Console.WriteLine("Lettura File: " + e.Message);
            }
        }

    }

}
